# 71. Django图书馆之出版社的增删改查 - 单表

# 基础阶段主要写图书馆的三种关系

分为,书,出版社,作者,三种关系

# 创建图书系统的django项目

怎么创建,请查看之前的文章

# 创建出版社需要的ORM配置

在models.py文件中

from django.db import models

# Create your models here.

class Press_sql(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=24)
    site = models.CharField(max_length=255)

写在models.py文件中,如果有关数据库操作的,比如,添加表、增加行、删除行、修改行等,都需要执行以下的步骤,让需要变更的操作,先记录在子项目的migrations目录中,在进行提交更改

生成记录命令:python3 manage.py makemigrations

提交变更记录修改命令:python3 manage.py migrate

自己生成测试数据,数据量不要求

# django模板语言

模板语言分为,变量语言跟逻辑语言

变量语言:

逻辑语言:

{% for i in ret %}  ## ret就是后端要传递的变量名
{% endfor %}

# 变量语言

比如,在前端的html中,增加,在调用的时候进行赋值

# 前端部分内容
<p id="p1">{{ warning }}</p>


# django内容
def Login(request):
    warning = "错误"
    return render(request,"login.html",{"warning":warning})

# 逻辑语言之for循环

{% for i in ret %}  ## ret就是后端要传递的变量名
    {{ i }}
    {{ forloop.counter }}             #--> for循环从1开始计数
    {{ forloop.counter0 }}            #--> for循环从0开始计数
{% endfor %}

# 业务逻辑代码

# 业务逻辑之查询

主要代码

## html代码
{% for i in press_user %}
    <tr>
        <td>{{ forloop.counter }}</td>
        <td>{{ i.name }}</td>
        <td>{{ i.site }}</td>
    </tr>
{% endfor %}
## 让后端把查到所有的出版社,并把对象返回给前端,前端使用模板语言中的for循环,循环展示数据


## 后端函数代码
from django.shortcuts import render,redirect
from Press.models import Press_sql
def press_subject(request):
    ## 获取表中所有的数据
    press_user = Press_sql.objects.all()
    
    ## 打开文件,并把获取到的所有数据传递到前端,让前端使用模板语言进行for循环取数据
    return render(request,"press.html",{'press_user':press_user})

# 业务逻辑之添加

主要代码

## 后端函数代码
from django.shortcuts import render,redirect
from Press.models import Press_sql
def press_add(request):
    # 获取数据
    name = request.POST.get("name")
    site = request.POST.get("site")
    
    ## 插入
    Press_sql.objects.create(name=name,site=site)
    
    ## 返回
    return redirect("/press/")

## 通过前端传来的数据,对数据进行插入

# 业务逻辑之删除

主要代码

## html代码
<a href="/press_del/?id={{ i.id }}" class="btn btn-danger" role="button">删除</a>
## 通过点击链接的方式,返回要删除的ID


## 后端函数代码
def press_del(request):
    ## 获取前端发来的GET模式的数据
    id = request.GET.get("id")

    ## 删除
    Press_sql.objects.filter(id=id).delete()

    ## 返回
    return redirect("/press/")

# 业务逻辑之编辑

主要代码

## html代码
<a class="btn sbu btn-info" role="button">编辑</a>
## 对于怎么获取ID,请看下面的完整代码


## 后端函数代码
def press_edit(request):
    ## 获取前端发来的POST模式的数据
    id = request.POST.get("id")
    name = request.POST.get("name")
    site = request.POST.get("site")

    ## 修改
    edit_sql = Press_sql.objects.get(id=id)
    edit_sql.name = name
    edit_sql.site = site
    edit_sql.save()

    ## 返回
    return redirect("/press/")

# 项目完整代码

QlpVde.png

# models.py文件

from django.db import models

# Create your models here.

class Press_sql(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=24)
    site = models.CharField(max_length=255)

# urls.py文件

from Press import views

urlpatterns = [
    url(r'^press/', views.press_subject),
    url(r'^press_add/', views.press_add),
    url(r'^press_del/', views.press_del),
    url(r'^press_edit/', views.press_edit),
]

# views.py文件

from django.shortcuts import render,redirect
from Press.models import Press_sql
# Create your views here.

## 查询
def press_subject(request):
    ## 获取表中所有的数据
    press_user = Press_sql.objects.all()

    ## 打开文件,并把获取到的所有数据传递到前端,让前端使用模板语言进行for循环取数据
    return render(request, "press.html", {'press_user': press_user})




## 添加
def press_add(request):
    # 获取数据
    name = request.POST.get("name")
    site = request.POST.get("site")

    ## 插入
    Press_sql.objects.create(name=name, site=site)

    ## 返回
    return redirect("/press/")




## 删除
def press_del(request):
    ## 获取前端发来的GET模式的数据
    id = request.GET.get("id")

    ## 删除
    Press_sql.objects.filter(id=id).delete()

    ## 返回
    return redirect("/press/")




## 编辑
def press_edit(request):
    ## 获取前端发来的POST模式的数据
    id = request.POST.get("id")
    name = request.POST.get("name")
    site = request.POST.get("site")

    ## 修改
    edit_sql = Press_sql.objects.get(id=id)
    edit_sql.name = name
    edit_sql.site = site
    edit_sql.save()

    ## 返回
    return redirect("/press/")

# press.html文件

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta http-equiv="content-Type" charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 描述网页,与之对应的属性值为content
    <meta name="keywords" content="">
    <meta name="description" content=""> -->
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
    <script src="/static/jquery-3.4.1.min.js"></script>
    <style>
        {# 显示的类 #}
        .show {
            display: block !important; 
        }

        {# 不显示的类 #}
        .hidden {
            display: none !important;
        }
    </style>
    <title>出版社</title>
</head>
<body>
<div class="container-fluid">
    <div class="page-header">
        <h1>出版社</h1>
    </div>
    <div class="panel panel-default panel-primary">
        <div class="panel-heading">出版社操作界面</div>
        <div class="panel-body">
            <table class="table table-striped table-hover table-bordered">
                <thead>
                <tr>
                    <th>序号</th>
                    <th>出版社</th>
                    <th>地址</th>
                    <th>操作</th>
                </tr>
                </thead>
                <tbody>
                {% for i in press_user %} {# 循环过滤从后端传递过来的数据 #}
                    <tr>
                        <td>{{ forloop.counter }}</td>
                        <td class="hidden"> {{ i.id }} </td> {# 获取每行的ID,但让其不显示,为后端逻辑需要的代码 #}
                        <td>{{ i.name }}</td>
                        <td>{{ i.site }}</td>
                        <td>
                            <a class="btn sbu btn-info" role="button">编辑</a>
                            <a href="/press_del/?id={{ i.id }}" class="btn btn-danger" role="button">删除</a> {# 通过a标签的特点,让点击后,带ID的值返回给后端 #}
                        </td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>

            {#       添加框      #}
            <button type="button" class="btn btn-primary bu" data-toggle="modal" data-target=".bs-example-modal-sm"
                    data-target="#myModal">
                添加出版社
            </button>
        
            <div class="modal fade bs-example-modal-sm in" tabindex="-1" role="dialog"
                 aria-labelledby="myLargeModalLabel" style="padding-right: 21px;">
                <div class="modal-dialog modal-lg" role="document">
                    <div class="modal-content">
                        <div class="modal-header">
                            <button type="button" class="close close1" data-dismiss="modal" aria-label="Close"><span
                                    aria-hidden="true">×</span></button>
                            <h4 class="modal-title" id="myLargeModalLabel">添加出版社</h4>
                        </div>
                        <div class="modal-body">
                            <form class="form-horizontal" action="/press_add/" method="post">
                                <div class="form-group">
                                    <label for="inputEmail3" class="col-sm-2 control-label">出版社名称</label>
                                    <div class="col-sm-10">
                                        <input type="text" name="name" id="inputHelpBlock" class="form-control"
                                               aria-describedby="helpBlock">
                                    </div>
                                </div>
                                <div class="form-group">
                                    <label for="inputPassword3" class="col-sm-2 control-label">出版社地址</label>
                                    <div class="col-sm-10">
                                        <input type="text" name="site" id="inputHelpBlock" class="form-control"
                                               aria-describedby="helpBlock">
                                    </div>
                                </div>
                                <div class="form-group">
                                    <div class="col-sm-offset-2 col-sm-10">
                                        <button type="submit" class="btn btn-default">确定添加</button>
                                    </div>
                                </div>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
            {#       添加框结束      #}

        </div>
    </div>
</div>

{#   编辑框     #}
<div class="modal  ssin_so" tabindex="-1" role="dialog"
     aria-labelledby="myLargeModalLabel">
    <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close close2" data-dismiss="modal" aria-label="Close"><span
                        aria-hidden="true">×</span></button>
                <h4 class="modal-title">编辑出版社</h4>
            </div>
            <div class="modal-body">
                <form class="form-horizontal" action="/press_edit/" method="post">
                    <div class="form-group">
                        <label for="inputEmail3" class="col-sm-2 control-label">出版社名称</label>
                        <div class="col-sm-10">
                            {# ID列,后端逻辑需要的数据,但让其不显示 #}
                            <input type="text" name="id" class="edit_frame_id hidden form-control"
                                   aria-describedby="helpBlock">
                            
                            <input type="text" name="name" class="edit_frame_name form-control"
                                   aria-describedby="helpBlock">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="inputPassword3" class="col-sm-2 control-label">出版社地址</label>
                        <div class="col-sm-10">
                            <input type="text" name="site" class="edit_frame_site form-control"
                                   aria-describedby="helpBlock">
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-sm-offset-2 col-sm-10">
                            <button type="submit" class="btn btn-default">确定修改</button>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
</div>
{#       编辑框结束      #}


</body>
<script>
    {#  添加框的点击开启事件  #}
    $(".bu").click(function () {
        $(".in").addClass("show");
    });

    {#  编辑框的占地开启事件  #}
    $(".sbu").click(function () {
        $(".ssin_so").addClass("show");
        var id = $(this).parent().prev().prev().prev().text(); {# 获取到当前点击行的数据库ID #}
        var name = $(this).parent().prev().prev().text(); {# 获取到当前点击行的name值 #}
        var site = $(this).parent().prev().text(); {# 获取到当前点击行的site值 #}
        $(".edit_frame_id").val(id); {# 获取到的值,显示到所在的输入框中 但ID框不显示,为后端传递数据需要 #}
        $(".edit_frame_name").val(name); {# 获取到的值,显示到所在的输入框中 #}
        $(".edit_frame_site").val(site); {# 获取到的值,显示到所在的输入框中 #}
    });

    {#  添加框的关闭事件  #}
    $(".close1").click(function () {
        $(".in").removeClass("show");
    });

    {#  编辑框的关闭事件  #}
    $(".close2").click(function () {
        $(".ssin_so").removeClass("show");
    })
</script>
</html>